工控网首页
>

应用设计

>

RVDS和MDK嵌入式开发工具调试脚本编写

RVDS和MDK嵌入式开发工具调试脚本编写

2013/9/25 10:32:50

最早使用的ARM开发工具是MDK 3.1,当时是为TI在DM335开发板上移植.Net Micro Framework,由于该开发板没有ISP工具,所以要调试内存版本的TinyCLR程序,必须要预先初始化SDRAM,否则无法把程序Download到内存中去。幸好MDK开发工具提供了一些脚本示例,所以相对比较容易的编写了一个初始化DM335 SDRAM的脚本,但是使用RVDS却没有这么幸运。  后期考虑到开发需要,我这边又配置了RVDS 4.0开发工具,由于一般用它调试ATMEL 的AT91的板子,该板子提供了ISP工具,所以调试时先打开该工具进行一遍SDRAM初始化,然后在用RVDS进行LoadImage调试,虽然有些麻烦,但也将就了。   最近在调试DM335上的wifi接口程序,奇怪的是用MDK编译运行后,出现异常,并且单步跟踪时,MDK工作老不正常。而同样的程序用RVDS编译后,下载到开发板运行,一切OK,所以我这边只好转移到RVDS平台上进行开发调试了。   但是,这就出现了开头提出的问题,没有ISP工具,如何进行SDRAM初始化?   我同事一直在用RVDS调试DM335,他的办法是编写了一个小的初始化SDRAM的程序,先用RVDS运行一遍,然后再加载实际要调试的程序。这不失为一种方法,但是我总觉得有些不方便,加上以前有写MDK脚本的经验,所以就希望在RVDS上编写一个类似的脚本。   如果你在搜索引擎搜索“MDK脚本”关键字时,你会搜出很多相关文章,但是你搜索“RVDS脚本”关键字时,却没有这么幸运,没有一篇文章相关介绍,所以最后没有办法,只好到官方网站,查看相关的技术文档了。   官网脚本相关文档的链接如下,想深入研究的朋友可以进入看一看。   http://infocenter.arm.com/help/i ... 0175k/Cihcbhaa.html   好了,入正题。一般写调试脚本,无非就是声明变量和函数,再就是对寄存器进行读写,然后下载镜像文件,最后在设置一下PC指针,就可以进行调试了。所以下面就这几个方面,比较一下MDK和RVDS脚本的异同(以DM335的调试脚本为例)。   一、变量声明   1、 MDK   2、 RVDS   二、函数声明   1、 MDK   2、 RVDS   注意:后面要有一个“.”   调用:   macro Clock_Setup()   三、寄存器读写   1、 MDK   2、 RVDS 四、镜像调入   1、 MDK   exec("LOAD C:\\MicroFramework\\BuildOutput\\ARM\\MDK3.1\\le\\RAM\\debug\\DM335\\bin\\TinyCLR.axf INCREMENTAL");   2、 RVDS   load/r 'C:\MF\client_v4_0_rtm\BuildOutput\ARM\RVDS4.0\le\RAM\debug\DM335\bin\tinyclr.axf'   五、设置PC指针   1、 MDK   PC = 0x80120000;   2、RVDS   @PC = 0x80120000;   六、脚本调用   1、 MDK(相关资料网上比较多,略)   2、 RVDS   方法一:直接在cmd窗口输入:Run>inc c:\mf\bat\dm335.inc   方法二:通过【Tools】->【Include Commands from file】菜单调入脚本文件,一旦运行过一次,该文件就会在【Tools】->【Recent Commands Scripts】菜单中出现,以后调用便非常方便。   运行后的截图如下:   

RVDS和MDK嵌入式开发工具调试脚本编写

  DEFINE LONG PSC;   DEFINE LONG SYSTEM;   PSC = 0x01C41000;   SYSTEM = 0x01C40000;
  add long PSC = 0x01C41000   add long SYSTEM = 0x01C40000
  FUNC void psc_change_state(void)   {   //…   }   调用:   Clock_Setup();
  define /R void psc_change_state()   {   }   .
  //0 Ignore request if the state is already set as is   if((_RDWORD(PSC+0x800+m_ID*4) & 0x1F) == m_State) return;   //1 Wait for PTSTAT.GOSTAT to clear   while(_RDWORD(PSC+0x128) & 0x1);   //2 Set MDCTLx.NEXT to new state   _WDWORD(PSC+0xA00+m_ID*4, _RDWORD(PSC+0xA00+m_ID*4) & 0xFFFFFFE0);   _WDWORD(PSC+0xA00+m_ID*4,_RDWORD(PSC+0xA00+m_ID*4) | m_State);
  //0 Ignore request if the state is already set as is   if((*(long *)(PSC+0x800+m_ID*4) & 0x1F) == m_State) { return; }   //1 Wait for PTSTAT.GOSTAT to clear   while(*(long *)(PSC+0x128) & 0x1);   //2 Set MDCTLx.NEXT to new state   *(long *)(PSC+0xA00+m_ID*4) &= 0xFFFFFFE0;   *(long *)(PSC+0xA00+m_ID*4) |= m_State;
投诉建议

提交

查看更多评论
其他资讯

查看更多

助力企业恢复“战斗状态”:MyMRO我的万物集·固安捷升级开工场景方案

车规MOSFET技术确保功率开关管的可靠性和强电流处理能力

未来十年, 化工企业应如何提高资源效率及减少运营中的碳足迹?

2023年制造业“开门红”,抢滩大湾区市场锁定DMP工博会

2023钢铁展洽会4月全新起航 将在日照触发更多商机